#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk
import os
import os.path
from time import time


from Exemplos import *
from Metodo import *
from Progresso import *

import SalvarJPEG



def evento_termina(*args):
   """Termina a aplicacao"""

   gtk.main_quit()



def evento_combo_mudou(*args):
    """Mudou a imagem ou a marca d'água"""

    global comboImagens, comboMarcas, image1

    arq1 = exemplos_get_selected( comboImagens )
    arq2 = exemplos_get_selected( comboMarcas )

    if arq1 != "":
        arq1 = os.path.join( "exemplos", "imagens", arq1 )

    if arq2 != "":
        arq2 = os.path.join( "exemplos", "marcas", arq2 )

    metodo_load_imagens( arq1, arq2 )



def evento_executa(*args):
    """O usuário clicou no botão 'executar', então faz tudo aqui."""

    global comboMetodos
    global spinAlpha, spinX, spinY
    global labelStatus, progressBar

    alpha = spinAlpha.get_value()
    x = spinX.get_value()
    y = spinY.get_value()
    metodo = comboMetodos.get_active()

    labelStatus.set_text( "Processando..." )
    labelStatus.show()

    metodo_params( metodo, alpha, x, y )

    progresso_run( 0.0 )
    t1 = time()
    metodo_run()
    t2 = time()
    progresso_run( 1.0 )

    st = "%.4f" % (t2 - t1)
    labelStatus.set_text( "Concluído em " + st + " seg." )


def evento_img_clicou(widget, event, *args):

    global image1, spinX, spinY

    pb = image1.get_pixbuf()
    if pb == None:
        return
    else:
        w = pb.get_width()
        h = pb.get_height()

    if  event.x < 0 or \
        event.y < 0 or \
        event.x >= w or \
        event.y >= h:
            return

    spinX.set_value( float(event.x) / w )
    spinY.set_value( float(event.y) / h )

    evento_executa()


def evento_extrai(*args):

    global comboMetodos
    qual_metodo = comboMetodos.get_active()
    metodo_extract( qual_metodo )
    progresso_run( 1.0 )


def evento_inverte(*args):

    metodo_inverte()
    progresso_run( 1.0 )


def evento_espelhar_v(*args):

    metodo_espelha( v=True )
    progresso_run( 1.0 )


def evento_espelhar_h(*args):

    metodo_espelha( v=False )
    progresso_run( 1.0 )


def evento_salva(*args):

    global image1

    pixbuf = image1.get_pixbuf()
    if pixbuf == None:
        return

    dlg = gtk.FileChooserDialog( \
        title = "Salvar Resultado", \
        action = gtk.FILE_CHOOSER_ACTION_SAVE, \
        buttons = ( \
            gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, \
            gtk.STOCK_SAVE, gtk.RESPONSE_OK) \
        )

    dlg.set_do_overwrite_confirmation( True )

    filtro = gtk.FileFilter()
    filtro.set_name( "Imagens (*.jpg)" )
    filtro.add_mime_type( "image/jpeg" )
    filtro.add_pattern( "*.jpg" )
    dlg.add_filter( filtro )

    resposta = dlg.run()

    if resposta == gtk.RESPONSE_OK:
        arq = dlg.get_filename()
        if arq[:-4].lower() != ".jpg":
            arq += ".jpg"
    else:
        arq = ""

    dlg.destroy()

    if arq != "":
        salva, qualidade = SalvarJPEG.escolhe_qualidade()
        q = str( int(qualidade) )

        if salva:
            pixbuf.save( arq, "jpeg", {"quality" : q} )



def carrega_default():
    """Carrega o primeiro exemplo de imagem/marca d'agua e define
    parametros iniciais, alem de preencher a lista de metodos"""

    global comboMetodos
    global comboImagens, comboMarcas, spinX, spinY, spinAlpha

    ###
    textRenderer = gtk.CellRendererText()
    comboMetodos.pack_start( textRenderer, expand = True )
    comboMetodos.add_attribute( textRenderer, 'text', 0 )

    model = comboMetodos.get_model()

    #insere metodos na combo de metodos da interface
    for m in metodo_nomes:
        nome_do_metodo = metodo_nomes[m]
        model.append( [nome_do_metodo] )

    comboMetodos.set_active( METODO_COMBINACAO_LINEAR )


    spinX.set_value( 0.3 )
    spinY.set_value( 0.3 )
    spinAlpha.set_value( 0.5 )

    if comboImagens.get_model().iter_n_children(None) > 0:
        comboImagens.set_active( 0 )

    if comboMarcas.get_model().iter_n_children(None) > 0:
        comboMarcas.set_active( 0 )




builder = gtk.Builder()
builder.add_from_file( "Port.glade" )

windowPdi = builder.get_object ("windowPdi" )
btnExecutar = builder.get_object( "btnExecutar" )
btnSalvar = builder.get_object( "btnSalvar" )
btnExtrair = builder.get_object( "btnExtrair" )
btnInverter = builder.get_object( "btnInverter" )
comboImagens = builder.get_object( "comboImagens" )
comboMarcas = builder.get_object( "comboMarcas" )
storeImagens = builder.get_object( "storeImagens" )
storeMarcas = builder.get_object( "storeMarcas" )
comboMetodos = builder.get_object( "comboMetodos" )
image1 = builder.get_object( "image1" )
imageEvents = builder.get_object( "imageEvents" )
spinAlpha = builder.get_object( "spinAlpha" )
spinX = builder.get_object( "spinX" )
spinY = builder.get_object( "spinY" )
progressBar = builder.get_object( "progressBar" )
labelStatus = builder.get_object( "labelStatus" )
btnEspelharV = builder.get_object( "btnEspelharV" )
btnEspelharH = builder.get_object( "btnEspelharH" )


windowPdi.connect( "destroy", evento_termina )
comboImagens.connect( "changed", evento_combo_mudou )
comboMarcas.connect( "changed", evento_combo_mudou )
btnExecutar.connect( "clicked", evento_executa )
btnExtrair.connect( "clicked", evento_extrai )
btnSalvar.connect( "clicked", evento_salva )
btnInverter.connect( "clicked", evento_inverte )
btnEspelharV.connect( "clicked", evento_espelhar_v )
btnEspelharH.connect( "clicked", evento_espelhar_h )
imageEvents.connect( "button-press-event", evento_img_clicou )

progresso_configura( progressBar )
metodo_configura( image1 )
exemplos_configura_lista( comboImagens )
exemplos_configura_lista( comboMarcas )
exemplos_carrega_lista( storeImagens, "imagens" )
exemplos_carrega_lista( storeMarcas, "marcas" )
carrega_default()

windowPdi.show()
gtk.main()
